//#include <stdio.h>
//#include <string.h>
//#include <limits.h>
//
//#define min(a, b) ((a) < (b) ? (a) : (b))
//#define INF (1LL << 60)
//
//int main()
//{
//    int n, m;
//    scanf_s("%d %d", &n, &m);
//    int x[n], y[n];
//    for (int i = 0; i < n; i++) 
//    {
//        scanf_s("%d %d", &x[i], &y[i]);
//    }
//
//    long long dp[2][m + 1][2];
//    int cur = 0, next = 1;
//    for (int j = 0; j <= m; j++) 
//    {
//        dp[cur][j][0] = INF;
//        dp[cur][j][1] = INF;
//    }
//    dp[cur][0][0] = 0;
//
//    for (int i = 0; i < n; i++) 
//    {
//        for (int j = 0; j <= m; j++)
//        {
//            dp[next][j][0] = dp[cur][j][0];
//            dp[next][j][1] = dp[cur][j][1];
//        }
//        for (int j = 0; j <= m; j++)
//        {
//            if (dp[cur][j][0] < INF) 
//            {
//                long long current_time = dp[cur][j][0];
//                int new_j = min(j + x[i], m);
//                dp[next][new_j][0] = min(dp[next][new_j][0], current_time + y[i]);
//                new_j = min(j + 2 * x[i], m);
//                dp[next][new_j][1] = min(dp[next][new_j][1], current_time + y[i] / 2);
//            }
//            if (dp[cur][j][1] < INF) 
//            {
//                long long current_time = dp[cur][j][1];
//                int new_j = min(j + x[i], m);
//                dp[next][new_j][1] = min(dp[next][new_j][1], current_time + y[i]);
//            }
//        }
//        cur = next;
//        next = 1 - next;
//    }
//
//    long long ans = min(dp[cur][m][0], dp[cur][m][1]);
//    printf("%lld\n", ans);
//    return 0;
//}

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))

int N, M;
int s[305];
int children[305][305];
int child_cnt[305]; 
int size[305]; 
int dp[305][305]; 

void dfs(int u) 
{
    size[u] = 1;
    for (int j = 0; j <= M; j++) 
    {
        dp[u][j] = -1000000;
    }
    dp[u][0] = 0;
    if (u >= 1)
    {
        dp[u][1] = s[u];
        size[u] = 1;
    }
    else
    {
        dp[u][0] = 0;
        size[u] = 0;
    }

    for (int i = 0; i < child_cnt[u]; i++)
    {
        int v = children[u][i];
        dfs(v);
        int temp[305];
        for (int j = 0; j <= M; j++) 
        {
            temp[j] = -1000000;
        }
        for (int j = 0; j <= min(M, size[u]); j++)
        {
            if (dp[u][j] < 0) continue;
            for (int k = 0; k <= min(M - j, size[v]); k++) 
            {
                if (dp[v][k] < 0) continue;
                temp[j + k] = max(temp[j + k], dp[u][j] + dp[v][k]);
            }
        }
        for (int j = 0; j <= M; j++)
        {
            if (temp[j] > dp[u][j])
            {
                dp[u][j] = temp[j];
            }
        }
        size[u] += size[v];
    }
}

int main() 
{
    scanf_s("%d %d", &N, &M);
    for (int i = 0; i <= N; i++)
    {
        child_cnt[i] = 0;
    }
    s[0] = 0; 
    for (int i = 1; i <= N; i++)
    {
        int k;
        scanf_s("%d %d", &k, &s[i]);
        if (k == 0) 
        {
            children[0][child_cnt[0]++] = i;
        }
        else 
        {
            children[k][child_cnt[k]++] = i;
        }
    }
    dfs(0);
    printf("%d\n", dp[0][M]);
    return 0;
}